home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP06 / BLOKOUT2.C < prev    next >
C/C++ Source or Header  |  1995-12-31  |  5KB  |  154 lines

  1. /*---------------------------------------------------
  2.    BLOKOUT2.C -- Mouse Button & Capture Demo Program
  3.                  (c) Charles Petzold, 1996
  4.   ---------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7.  
  8. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  9.  
  10. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  11.                     PSTR szCmdLine, int iCmdShow)
  12.      {
  13.      static char szAppName[] = "BlokOut2" ;
  14.      HWND        hwnd ;
  15.      MSG         msg ;
  16.      WNDCLASSEX  wndclass ;
  17.  
  18.      wndclass.cbSize        = sizeof (wndclass) ;
  19.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  20.      wndclass.lpfnWndProc   = WndProc ;
  21.      wndclass.cbClsExtra    = 0 ;
  22.      wndclass.cbWndExtra    = 0 ;
  23.      wndclass.hInstance     = hInstance ;
  24.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  25.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  26.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  27.      wndclass.lpszMenuName  = NULL ;
  28.      wndclass.lpszClassName = szAppName ;
  29.      wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
  30.  
  31.      RegisterClassEx (&wndclass) ;
  32.  
  33.      hwnd = CreateWindow (szAppName, "Mouse Button & Capture Demo",
  34.                           WS_OVERLAPPEDWINDOW,
  35.                           CW_USEDEFAULT, CW_USEDEFAULT,
  36.                           CW_USEDEFAULT, CW_USEDEFAULT,
  37.                           NULL, NULL, hInstance, NULL) ;
  38.  
  39.      ShowWindow (hwnd, iCmdShow) ;
  40.      UpdateWindow (hwnd) ;
  41.  
  42.      while (GetMessage (&msg, NULL, 0, 0))
  43.           {
  44.           TranslateMessage (&msg) ;
  45.           DispatchMessage (&msg) ;
  46.           }
  47.      return msg.wParam ;
  48.      }
  49.  
  50. void DrawBoxOutline (HWND hwnd, POINT ptBeg, POINT ptEnd)
  51.      {
  52.      HDC hdc ;
  53.  
  54.      hdc = GetDC (hwnd) ;
  55.  
  56.      SetROP2 (hdc, R2_NOT) ;
  57.      SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
  58.      Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
  59.  
  60.      ReleaseDC (hwnd, hdc) ;
  61.      }
  62.  
  63. LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  64.      {
  65.      static BOOL  fBlocking, fValidBox ;
  66.      static POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;
  67.      HDC          hdc ;
  68.      PAINTSTRUCT  ps ;
  69.  
  70.      switch (iMsg)
  71.           {
  72.           case WM_LBUTTONDOWN :
  73.                ptBeg.x = ptEnd.x = LOWORD (lParam) ;
  74.                ptBeg.y = ptEnd.y = HIWORD (lParam) ;
  75.  
  76.                DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
  77.  
  78.                SetCapture (hwnd) ;
  79.                SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  80.  
  81.                fBlocking = TRUE ;
  82.                return 0 ;
  83.  
  84.           case WM_MOUSEMOVE :
  85.                if (fBlocking)
  86.                     {
  87.                     SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
  88.  
  89.                     DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
  90.  
  91.                     ptEnd.x = LOWORD (lParam) ;
  92.                     ptEnd.y = HIWORD (lParam) ;
  93.  
  94.                     DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
  95.                     }
  96.                return 0 ;
  97.  
  98.           case WM_LBUTTONUP :
  99.                if (fBlocking)
  100.                     {
  101.                     DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
  102.  
  103.                     ptBoxBeg   = ptBeg ;
  104.                     ptBoxEnd.x = LOWORD (lParam) ;
  105.                     ptBoxEnd.y = HIWORD (lParam) ;
  106.  
  107.                     ReleaseCapture () ;
  108.                     SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  109.  
  110.                     fBlocking = FALSE ;
  111.                     fValidBox  = TRUE ;
  112.  
  113.                     InvalidateRect (hwnd, NULL, TRUE) ;
  114.                     }
  115.                return 0 ;
  116.  
  117.           case WM_CHAR :
  118.                if (fBlocking & wParam == '\x1B')       // i.e., Escape
  119.                     {
  120.                     DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
  121.                     ReleaseCapture () ;
  122.                     SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  123.  
  124.                     fBlocking = FALSE ;
  125.                     }
  126.                return 0 ;
  127.  
  128.           case WM_PAINT :
  129.                hdc = BeginPaint (hwnd, &ps) ;
  130.  
  131.                if (fValidBox)
  132.                     {
  133.                     SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
  134.                     Rectangle (hdc, ptBoxBeg.x, ptBoxBeg.y,
  135.                                     ptBoxEnd.x, ptBoxEnd.y) ;
  136.                     }
  137.  
  138.                if (fBlocking)
  139.                     {
  140.                     SetROP2 (hdc, R2_NOT) ;
  141.                     SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
  142.                     Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
  143.                     }
  144.  
  145.                EndPaint (hwnd, &ps) ;
  146.                return 0 ;
  147.  
  148.           case WM_DESTROY :
  149.                PostQuitMessage (0) ;
  150.                return 0 ;
  151.           }
  152.      return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
  153.      }
  154.